using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Marlimer.Common;
using Marlimer.Common.EntidadesGrilla;
using Marlimer.Logical.Comercial;
using Marlimer.Logical.Universal;


namespace Marlimer.Comercial.Procesos
{
    public partial class frm_PagoDocumentoMasivo : Form
    {

        lcom_Transportista lcom_transportista = new lcom_Transportista();
        lcom_Ruta lcom_ruta = new lcom_Ruta();
        lcom_Modulo lcom_modulo = new lcom_Modulo();
        lcom_CondicionVenta lcom_condicionventa = new lcom_CondicionVenta();
        luni_TipoDocVta luni_tipodocvta = new luni_TipoDocVta();
        luni_TipoPago luni_tipopago = new luni_TipoPago();
        lcom_Cobrador lcom_cobrador = new lcom_Cobrador();
        lcom_DocumentoCab lcom_documentocab = new lcom_DocumentoCab(); 

        List<itemsGrilla> itemsGrid = new List<itemsGrilla>();   



        public frm_PagoDocumentoMasivo()
        {
            InitializeComponent();
        }

        private void validarPermisos()
        {
            bool sinaccesos = false;
            //verificar los permisos del usuario
            InfoUsuario usuario = Session.getInfousuario();
            if (usuario.ctip_user == 2)
            {
                //validar si tiene permisos para pasar descuentos
                if (usuario.flg_liquidar == 1)
                {
                    btnLiquidar.Visible = true;
                }
                else
                {
                    btnLiquidar.Visible = false;
                }
            }
        }

        private void frm_PagoDocumentoMasivo_Load(object sender, EventArgs e)
        {
            validarPermisos();
 
            itemsGrid.Add(new itemsGrilla("ccod_doc", "", 0, false, true, DataGridViewContentAlignment.MiddleRight));
            itemsGrid.Add(new itemsGrilla("cabre_docvta", "Tip.Doc.", 50, true, true, DataGridViewContentAlignment.MiddleLeft));
            itemsGrid.Add(new itemsGrilla("cnum_serie", "Serie", 40, true, true, DataGridViewContentAlignment.MiddleRight));
            itemsGrid.Add(new itemsGrilla("cnum_docvta", "Num Doc.", 60, true, true, DataGridViewContentAlignment.MiddleRight));
            itemsGrid.Add(new itemsGrilla("dfec_ent", "Fec.Entrega", 70, true, true, DataGridViewContentAlignment.MiddleLeft));
            itemsGrid.Add(new itemsGrilla("ccod_cli", "Cliente", 50, true, true, DataGridViewContentAlignment.MiddleRight));
            itemsGrid.Add(new itemsGrilla("craz_soc", "Razon Social", 180, true, true, DataGridViewContentAlignment.MiddleLeft));
            itemsGrid.Add(new itemsGrilla("cdes_condvta", "Cond.Vta", 80, true, true, DataGridViewContentAlignment.MiddleLeft));
            itemsGrid.Add(new itemsGrilla("cnom_mone", "Moneda", 70, true, true, DataGridViewContentAlignment.MiddleLeft));
            itemsGrid.Add(new itemsGrilla("ntot_neto", "Total", 70, true, true, DataGridViewContentAlignment.MiddleRight, "F"));
            itemsGrid.Add(new itemsGrilla("ntot_netoliq", "Total liq", 70, true, true, DataGridViewContentAlignment.MiddleRight, "F"));
            itemsGrid.Add(new itemsGrilla("ntot_cre", "Credito", 70, true, true, DataGridViewContentAlignment.MiddleRight, "F"));
            itemsGrid.Add(new itemsGrilla("saldo_neto", "Saldo", 70, true, true, DataGridViewContentAlignment.MiddleRight, "F"));
            itemsGrid.Add(new itemsGrilla("saldo_netoliq", "Saldo liq", 70, true, true, DataGridViewContentAlignment.MiddleRight, "F"));


            this.Location = new Point(0, 0);

            ConfigurarRejilla();

            CargarCombos();

            dtpFecEnt.Value = System.DateTime.Today;
            dtpFecPago.Value = System.DateTime.Today;

        }

        private void ConfigurarRejilla()
        {
            gridResultados.Columns.Clear();
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Tip.Doc.", 50, true, true, DataGridViewContentAlignment.MiddleRight));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Serie", 40, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Num Doc.", 60, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Fec.Entrega", 70, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Cliente", 50, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Razon Social", 180, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Cond.Vta", 80, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Moneda", 70, true, true, DataGridViewContentAlignment.MiddleLeft));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Total", 70, true, true, DataGridViewContentAlignment.MiddleRight));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Total liq", 70, true, true, DataGridViewContentAlignment.MiddleRight));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Credito", 70, true, true, DataGridViewContentAlignment.MiddleRight));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Saldo", 70, true, true, DataGridViewContentAlignment.MiddleRight));
            gridResultados.Columns.Add(Util.createDataGridTextColumn("Saldo liq", 70, true, true, DataGridViewContentAlignment.MiddleRight));

            //gridResultados.AllowUserToResizeColumns = false;
            gridResultados.AllowUserToResizeRows = false;
            gridResultados.RowHeadersVisible = false;
            gridResultados.AllowUserToAddRows = false;
            gridResultados.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
        }


        private void CargarCombos()
        {
            Util.LlenarDataCombo(lcom_modulo.getDTModulo(), cboModulo, true);
            Util.LlenarDataCombo(lcom_ruta.getDTRuta(), cboRuta, true);
            Util.LlenarDataCombo(lcom_transportista.getDTTransportista(), cboTransportista, true);
            Util.LlenarDataCombo(luni_tipodocvta.getDTTipoDocvta(), cboTipoDocVta, true);
            Util.LlenarDataCombo(lcom_condicionventa.getDTCondicionVenta(), cboCondVta, false);
            Util.LlenarDataCombo(luni_tipopago.getDTTipoPago(1), cboTipoPago, false);
            Util.LlenarDataCombo(lcom_cobrador.getDTCobrador(), cboCobrador, true);
            
        }

        private void nuevaBusqueda()
        {
            CargarCombos();
            gridResultados.DataSource = null;
            ConfigurarRejilla();
            panAsignarLiquidacion.Enabled = false;
            chkSoloSeleccionados.Checked = false;
        }

        private void cboGeneral_KeyPress(object sender, KeyPressEventArgs e)
        {
            Util.validaEnter(e.KeyChar);
        }

        private void txtGeneral_Leave(object sender, EventArgs e)
        {
            TextBox txt = (TextBox)sender;
            String value = "";
            int valuenum = -1;
            String nametxt = txt.Name;
            object newval = null;

            if (txt.Text.Trim() != "")
            {
                value = txt.Text;
                valuenum = Convert.ToInt32(Util.ToValor(txt.Text));
            }

            switch (nametxt)
            {
                case "txtCodModulo":
                    {
                        cboModulo.SelectedValue = value;
                        newval = cboModulo.SelectedValue;
                        break;
                    }
                case "txtCodRuta":
                    {
                        cboRuta.SelectedValue = valuenum;
                        newval = cboRuta.SelectedValue;
                        break;
                    }
                case "txtCodTransportista":
                    {
                        cboTransportista.SelectedValue = valuenum;
                        newval = cboTransportista.SelectedValue;
                        break;
                    }
                case "txtCodCobrador":
                    {
                        cboCobrador.SelectedValue = valuenum;
                        newval = cboCobrador.SelectedValue;  
                        break;
                    }
            }
            txt.Text = Convert.ToString(newval);
        }

        private void cboGeneralDT_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox cbo = (ComboBox)sender;
            String valor = "";
            String namecbo = cbo.Name;
            //validamos que el indice seleccionado sea mayor a -1
            if (cbo.SelectedIndex > -1 && cbo.SelectedValue.ToString() != "System.Data.DataRowView")
            {
                valor = Convert.ToString(cbo.SelectedValue);
            }

            switch (namecbo)
            {
                case "cboModulo":
                    {
                        txtCodModulo.Text = valor;
                        break;
                    }
                case "cboRuta":
                    {
                        txtCodRuta.Text = valor;
                        break;
                    }
                case "cboTransportista":
                    {
                        txtCodTransportista.Text = valor;
                        break;
                    }
                case "cboCobrador":
                    {
                        txtCodCobrador.Text = valor; 
                        break; 
                    }
            }

        }

        private void txtGeneralSelect_Enter(object sender, EventArgs e)
        {
            Util.selectAllText(((TextBox)sender));
        }

        private void txtCodModulo_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = Convert.ToChar(e.KeyChar.ToString().ToUpper());
            e.Handled = Util.validaTecla(e.KeyChar, "AlfaNumerico", ((TextBox)sender).Text, true);
        }

        private void txtGeneralEntero_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Util.validaTecla(e.KeyChar, "Entero", ((TextBox)sender).Text, true);
        }

        private void btnNuevaBusqueda_Click(object sender, EventArgs e)
        {
            nuevaBusqueda();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            DataTable dtresul = lcom_documentocab.MostrarDocumentosToLiquidar(dtpFecEnt.Value, Convert.ToInt32(cboTipoDocVta.SelectedValue), Convert.ToInt32(cboCondVta.SelectedValue),   
                         Convert.ToInt32(cboTransportista.SelectedValue), Convert.ToInt32(cboRuta.SelectedValue), Convert.ToString(cboModulo.SelectedValue));

            gridResultados.DataSource = null;
            ConfigurarRejilla();

            if (dtresul.Rows.Count > 0)
            {
                gridResultados.Columns.Clear();
                //recorrer el datagrid
                gridResultados.DataSource = dtresul;
                Util.setRejillaColumns(gridResultados, itemsGrid);
                calcularTotales(dtresul);
                lblResultados.Text = "Registros encontrados: " + dtresul.Rows.Count.ToString();
                panAsignarLiquidacion.Enabled = true;
            }
            else
            {
                //no se encontraron resultados.
                lblResultados.Text = "No se encontraron resultados.";
                panAsignarLiquidacion.Enabled = false;
                cboCobrador.SelectedIndex = -1;
                txtCobrar.Text = "0.00";
                txtCobrarLiq.Text = "0.00";
                txtTotal.Text = "0.00";
                txtTotalLiq.Text = "0.00";
                txtCreditos.Text = "0.00";
            }
        }

        private void btnLiquidar_Click(object sender, EventArgs e)
        {
            //para liquidar se debe hacer seleccionado un cobrador
            //y un tipo de pago.
            if (Convert.ToInt32(cboCobrador.SelectedValue) > 0)
            {
                List<InfoDocumentoLiquidar> docsliqs = new List<InfoDocumentoLiquidar>();
                Boolean entro = false;

                //recorrer la grilla e ir llenando la coleccion 
                for (int i = 0; i < gridResultados.Rows.Count; i++)
                {
                    InfoDocumentoLiquidar docliq = new InfoDocumentoLiquidar();
                    docliq.ccod_cobra = Convert.ToInt32(cboCobrador.SelectedValue);
                    docliq.ccod_doc = Convert.ToInt32(gridResultados.Rows[i].Cells["ccod_doc"].Value);
                    docliq.ccod_tipopago = Convert.ToInt32(cboTipoPago.SelectedValue);
                    docliq.ccod_docnc = Convert.ToInt64(gridResultados.Rows[i].Cells["ccod_docnc"].Value);
                    docliq.dfec_pago = dtpFecPago.Value;
                    docliq.nimp_pago = Convert.ToDouble(gridResultados.Rows[i].Cells["saldo_neto"].Value);
                    docliq.nimp_pagoliq = Convert.ToDouble(gridResultados.Rows[i].Cells["saldo_netoliq"].Value);
                    docliq.ntot_cre = Convert.ToDouble(gridResultados.Rows[i].Cells["ntot_cre"].Value);
                    docsliqs.Add(docliq);
                    entro = true;
                }

                //si entro entonces se procede a ejecutar el guardado
                if (entro)
                {
                    //preguntamos si es que desea guardar la liquidacion
                    if (MessageBox.Show("Seguro que desea guardar la cobranza?", this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    {
                        resulMsgError resul = lcom_documentocab.liquidarDocumento(docsliqs);
                        if (resul.resul)
                        {
                            MessageBox.Show(resul.message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                            nuevaBusqueda();
                        }
                        else
                        {
                            MessageBox.Show(resul.message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un cobrador", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void calcularTotales(DataTable dt)
        {
            //Sumar para cada columnas

            txtCreditos.Text = Convert.ToString(Util.agregado(1, dt, "ntot_cre"));
            txtCobrar.Text = Convert.ToString(Util.agregado(1, dt, "saldo_neto"));
            txtCobrarLiq.Text = Convert.ToString(Util.agregado(1, dt, "saldo_netoliq"));
            txtTotal.Text = Convert.ToString(Util.agregado(1, dt, "ntot_neto"));
            txtTotalLiq.Text = Convert.ToString(Util.agregado(1, dt, "ntot_netoliq"));
        }


    }
}